// 后端主应用文件

// 导入依赖
const express = require('express');
const cors = require('cors');
const path = require('path');
const fs = require('fs').promises;
const fsSync = require('fs');

// 创建Express应用
const app = express();

// 配置中间件
app.use(cors()); // 允许跨域请求
app.use(express.json()); // 解析JSON请求体

// 音乐文件存储路径 - 支持从环境变量覆盖
const MUSIC_DIR = process.env.MUSIC_DIR || path.join(__dirname, '..', 'music');
console.log('使用的音乐目录:', MUSIC_DIR);

// 导入并使用音乐API路由
const musicRoutes = require('./routes/musicRoutes');
app.use('/music', musicRoutes);

// 静态文件服务 - 提供音乐文件访问
app.use('/static-music', express.static(MUSIC_DIR, {
    setHeaders: (res, path) => {
        // 设置适当的MIME类型
        if (path.endsWith('.mp3')) {
            res.setHeader('Content-Type', 'audio/mpeg');
        } else if (path.endsWith('.flac')) {
            res.setHeader('Content-Type', 'audio/flac');
        } else if (path.endsWith('.wav')) {
            res.setHeader('Content-Type', 'audio/wav');
        } else if (path.endsWith('.m4a')) {
            res.setHeader('Content-Type', 'audio/mp4');
        } else if (path.endsWith('.aac')) {
            res.setHeader('Content-Type', 'audio/aac');
        } else if (path.endsWith('.ogg')) {
            res.setHeader('Content-Type', 'audio/ogg');
        } else if (path.endsWith('.wma')) {
            res.setHeader('Content-Type', 'audio/x-ms-wma');
        } else if (path.endsWith('.aiff') || path.endsWith('.aif')) {
            res.setHeader('Content-Type', 'audio/aiff');
        } else if (path.endsWith('.alac')) {
            res.setHeader('Content-Type', 'audio/alac');
        } else if (path.endsWith('.jpg') || path.endsWith('.jpeg')) {
            res.setHeader('Content-Type', 'image/jpeg');
        } else if (path.endsWith('.png')) {
            res.setHeader('Content-Type', 'image/png');
        } else if (path.endsWith('.txt') || path.endsWith('.lrc')) {
            res.setHeader('Content-Type', 'text/plain; charset=utf-8');
        }
    }
}));

// 静态文件服务 - 提供前端文件访问
app.use(express.static(path.join(__dirname, '..', '前端')));

// 处理所有未匹配的路由，返回前端主页
app.get('*', (req, res) => {
    res.sendFile(path.join(__dirname, '..', '前端', 'index.html'));
});



// 创建音乐目录（如果不存在）
function createMusicDirectory() {
    if (!fsSync.existsSync(MUSIC_DIR)) {
        try {
            fsSync.mkdirSync(MUSIC_DIR, { recursive: true });
            console.log('音乐目录已创建');
        } catch (error) {
            console.error('创建音乐目录失败:', error);
        }
    }
}

// 启动服务器
const PORT = process.env.PORT || 15001;
console.log(`尝试启动服务器，监听端口：${PORT}`);
console.log(`使用的音乐目录：${MUSIC_DIR}`);

// 先尝试创建音乐目录，确保目录存在
try {
    createMusicDirectory();
} catch (error) {
    console.error('创建音乐目录失败，继续尝试启动服务器:', error);
}

// 监听所有接口，确保可以从外部访问
const server = app.listen(PORT, '0.0.0.0', () => {
    // 获取本机IP地址
    const os = require('os');
    const networkInterfaces = os.networkInterfaces();
    let serverIp = 'localhost';
    
    // 尝试获取第一个非本地IP地址
    for (const interfaceName in networkInterfaces) {
        for (const info of networkInterfaces[interfaceName]) {
            if (info.family === 'IPv4' && !info.internal) {
                serverIp = info.address;
                break;
            }
        }
    }
    
    console.log(`\n\n\n✅ 凌宇音乐后端服务已成功启动！`);
    console.log(`==================================================`);
    console.log(`请在浏览器中访问：`);
    console.log(`- http://${serverIp}:${PORT}`);
    console.log(`- http://localhost:${PORT}`);
    console.log(`==================================================`);
    console.log(`请在${MUSIC_DIR}目录下按照要求的结构添加音乐文件`);
    console.log(`按Ctrl+C可以停止服务器`);
    console.log(`==================================================\n`);
});

// 捕获服务器启动错误
server.on('error', (error) => {
    console.error('\n\n❌ 服务器启动失败:', error);
    if (error.code === 'EACCES') {
        console.error('错误：权限不足，需要root权限运行才能使用此端口');
    } else if (error.code === 'EADDRINUSE') {
        console.error(`错误：端口 ${PORT} 已被占用，请选择其他端口`);
    } else {
        console.error('详细错误信息:', error);
    }
    
    // 1秒后退出进程
    setTimeout(() => {
        process.exit(1);
    }, 1000);
});

// 捕获未处理的异常
process.on('uncaughtException', (error) => {
    console.error('未处理的异常:', error);
});

// 捕获未处理的Promise拒绝
process.on('unhandledRejection', (reason, promise) => {
    console.error('未处理的Promise拒绝:', reason);
});